package com.wxw.BaseLibrary.location;

import android.content.Context;
import android.telephony.CellLocation;
import android.telephony.NeighboringCellInfo;
import android.telephony.PhoneStateListener;
import android.telephony.TelephonyManager;
import android.telephony.gsm.GsmCellLocation;
import android.util.Log;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;

/**
 * Created by david on 2017-06-27.
 */
public class CellInfoManager {
    private int asu;
    private int bid;
    private int cid;
    private boolean isCdma;
    private boolean isGsm;
    private int lac;
    private int lat;
    private final PhoneStateListener listener;
    private int lng;
    private int mcc;
    private int mnc;
    private int nid;
    private int sid;
    private TelephonyManager tel;
    private boolean valid;
    private Context context;
    public CellInfoManager(Context paramContext) {
        this.listener = new CellInfoListener(this);
        tel = (TelephonyManager) paramContext.getSystemService(Context.TELEPHONY_SERVICE);
        this.tel.listen(this.listener, PhoneStateListener.LISTEN_CELL_LOCATION | PhoneStateListener.LISTEN_SIGNAL_STRENGTH);
        context = paramContext;
    }
    public static int dBm(int i) {
        int j;
        if (i >= 0 && i <= 31) {
            j = i * 2 + -113;
        } else {
            j = 0;
        }
        return j;
    }
    public int asu() {
        return this.asu;
    }
    public int bid() {
        if (!this.valid) {
            update();
        }
        return this.bid;
    }
    public JSONObject cdmaInfo() {
        if (!isCdma()) {
            return null;
        }
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("bid", bid());
            jsonObject.put("sid", sid());
            jsonObject.put("nid", nid());
            jsonObject.put("lat", lat());
            jsonObject.put("lng", lng());
        } catch (JSONException ex) {
            jsonObject = null;
            Log.e("CellInfoManager", ex.getMessage());
        }
        return jsonObject;
    }
    public JSONArray cellTowers() {
        JSONArray jsonarray = new JSONArray();
        int lat;
        int mcc;
        int mnc;
        int aryCell[] = dumpCells();
        lat = lac();
        mcc = mcc();
        mnc = mnc();
        if (aryCell == null || aryCell.length < 2) {
            aryCell = new int[2];
            aryCell[0] = cid;
            aryCell[1] = -60;
        }
        for (int i = 0; i < aryCell.length; i += 2) {
            try {
                int j2 = dBm(i + 1);
                JSONObject jsonobject = new JSONObject();
                jsonobject.put("cell_id", aryCell[i]);
                jsonobject.put("location_area_code", lat);
                jsonobject.put("mobile_country_code", mcc);
                jsonobject.put("mobile_network_code", mnc);
                jsonobject.put("signal_strength", j2);
                jsonobject.put("age", 0);
                jsonarray.put(jsonobject);
            } catch (Exception ex) {
                ex.printStackTrace();
                Log.e("CellInfoManager", ex.getMessage());
            }
        }
        if (isCdma()) {
            jsonarray = new JSONArray();
        }
        return jsonarray;
    }
    public int cid() {
        if (!this.valid) {
            update();
        }
        return this.cid;
    }
    public int[] dumpCells() {
        int[] aryCells;
        if (cid() == 0) {
            aryCells = new int[0];
            return aryCells;
        }
        List<NeighboringCellInfo> lsCellInfo = this.tel.getNeighboringCellInfo();
        if (lsCellInfo == null || lsCellInfo.size() == 0) {
            aryCells = new int[1];
            int i = cid();
            aryCells[0] = i;
            return aryCells;
        }
        int[] arrayOfInt1 = new int[lsCellInfo.size() * 2 + 2];
        int j = 0 + 1;
        int k = cid();
        arrayOfInt1[0] = k;
        int m = j + 1;
        int n = asu();
        arrayOfInt1[j] = n;
        Iterator<NeighboringCellInfo> iter = lsCellInfo.iterator();
        while (true) {
            if (!iter.hasNext()) {
                break;
            }
            NeighboringCellInfo localNeighboringCellInfo = (NeighboringCellInfo) iter.next();
            int i2 = localNeighboringCellInfo.getCid();
            if ((i2 <= 0) || (i2 == 65535)) {
                continue;
            }
            int i3 = m + 1;
            arrayOfInt1[m] = i2;
            m = i3 + 1;
            int i4 = localNeighboringCellInfo.getRssi();
            arrayOfInt1[i3] = i4;
        }
        int[] arrayOfInt2 = new int[m];
        System.arraycopy(arrayOfInt1, 0, arrayOfInt2, 0, m);
        aryCells = arrayOfInt2;
        return aryCells;
    }
    public JSONObject gsmInfo() {
        if (!isGsm()) {
            return null;
        }
        JSONObject localObject = null;
        while (true) {
            try {
                JSONObject localJSONObject1 = new JSONObject();
                String str1 = this.tel.getNetworkOperatorName();
                localJSONObject1.put("operator", str1);
                String str2 = this.tel.getNetworkOperator();
                if ((str2.length() == 5) || (str2.length() == 6)) {
                    String str3 = str2.substring(0, 3);
                    String str4 = str2.substring(3, str2.length());
                    localJSONObject1.put("mcc", str3);
                    localJSONObject1.put("mnc", str4);
                }
                localJSONObject1.put("lac", lac());
                int[] arrayOfInt = dumpCells();
                JSONArray localJSONArray1 = new JSONArray();
                int k = 0;
                int m = arrayOfInt.length / 2;
                while (true) {
                    if (k >= m) {
                        localJSONObject1.put("cells", localJSONArray1);
                        localObject = localJSONObject1;
                        break;
                    }
                    int n = k * 2;
                    int i1 = arrayOfInt[n];
                    int i2 = k * 2 + 1;
                    int i3 = arrayOfInt[i2];
                    JSONObject localJSONObject7 = new JSONObject();
                    localJSONObject7.put("cid", i1);
                    localJSONObject7.put("asu", i3);
                    localJSONArray1.put(localJSONObject7);
                    k += 1;
                }
            } catch (JSONException localJSONException) {
                localObject = null;
            }
        }
    }
    public boolean isCdma() {
        if (!this.valid) {
            update();
        }
        return this.isCdma;
    }
    public boolean isGsm() {
        if (!this.valid) {
            update();
        }
        return this.isGsm;
    }
    public int lac() {
        if (!this.valid) {
            update();
        }
        return this.lac;
    }
    public int lat() {
        if (!this.valid) {
            update();
        }
        return this.lat;
    }
    public int lng() {
        if (!this.valid) {
            update();
        }
        return this.lng;
    }
    public int mcc() {
        if (!this.valid) {
            update();
        }
        return this.mcc;
    }
    public int mnc() {
        if (!this.valid) {
            update();
        }
        return this.mnc;
    }
    public int nid() {
        if (!this.valid) {
            update();
        }
        return this.nid;
    }
    public float score() {
        float f1 = 0f;
        int[] aryCells = null;
        int i = 0;
        float f2 = 0f;
        if (isCdma()) {
            f2 = 1065353216;
            return f2;
        }
        if (isGsm()) {
            f1 = 0.0F;
            aryCells = dumpCells();
            int j = aryCells.length;
            if (i >= j) {
                f2 = f1;
            }
        }
        if(i <=0 ) {
            return 1065353216;
        }
        int m = aryCells[i];
        for (i = 0; i < m; i++) {
            if ((m < 0) || (m > 31)) {
                f1 += 0.5F;
            } else {
                f1 += 1.0F;
            }
        }
        f2 = f1;
        return f2;
    }
    public int sid() {
        if (!this.valid) {
            update();
        }
        return this.sid;
    }
    public void update() {
        this.isGsm = false;
        this.isCdma = false;
        this.cid = 0;
        this.lac = 0;
        this.mcc = 0;
        this.mnc = 0;
        CellLocation cellLocation = this.tel.getCellLocation();
        int nPhoneType = this.tel.getPhoneType();
        if (nPhoneType == 1 && cellLocation instanceof GsmCellLocation) {
            this.isGsm = true;
            GsmCellLocation gsmCellLocation = (GsmCellLocation) cellLocation;
            int nGSMCID = gsmCellLocation.getCid();
            if (nGSMCID > 0) {
                if (nGSMCID != 65535) {
                    this.cid = nGSMCID;
                    this.lac = gsmCellLocation.getLac();
                }
            }
        }
        try {
            String strNetworkOperator = this.tel.getNetworkOperator();
            int nNetworkOperatorLength = strNetworkOperator.length();
            if (nNetworkOperatorLength != 5) {
                if (nNetworkOperatorLength != 6) {
                    ;
                }
            } else {
                this.mcc = Integer.parseInt(strNetworkOperator.substring(0, 3));
                this.mnc = Integer.parseInt(strNetworkOperator.substring(3, nNetworkOperatorLength));
            }
            if (this.tel.getPhoneType() == 2) {
                this.valid = true;
                Class<?> clsCellLocation = cellLocation.getClass();
                Class<?>[] aryClass = new Class[0];
                Method localMethod1 = clsCellLocation.getMethod("getBaseStationId", aryClass);
                Method localMethod2 = clsCellLocation.getMethod("getSystemId", aryClass);
                Method localMethod3 = clsCellLocation.getMethod("getNetworkId", aryClass);
                Object[] aryDummy = new Object[0];
                this.bid = ((Integer) localMethod1.invoke(cellLocation, aryDummy)).intValue();
                this.sid = ((Integer) localMethod2.invoke(cellLocation, aryDummy)).intValue();
                this.nid = ((Integer) localMethod3.invoke(cellLocation, aryDummy)).intValue();
                Method localMethod7 = clsCellLocation.getMethod("getBaseStationLatitude", aryClass);
                Method localMethod8 = clsCellLocation.getMethod("getBaseStationLongitude", aryClass);
                this.lat = ((Integer) localMethod7.invoke(cellLocation, aryDummy)).intValue();
                this.lng = ((Integer) localMethod8.invoke(cellLocation, aryDummy)).intValue();
                this.isCdma = true;
            }
        } catch (Exception ex) {
            Log.e("CellInfoManager", ex.getMessage());
        }
    }
    class CellInfoListener extends PhoneStateListener {
        CellInfoListener(CellInfoManager manager) {
        }
        @Override
        public void onCellLocationChanged(CellLocation paramCellLocation) {
            CellInfoManager.this.valid = false;
        }
        @Override
        public void onSignalStrengthChanged(int paramInt) {
            CellInfoManager.this.asu = paramInt;
        }
    }
}
